package com.example.sys.org.service;

import com.example.core.mapping.BaseMapping;
import com.example.core.service.BaseTreeServiceImpl;
import com.example.core.utils.UserUtils;
import com.example.sys.org.constant.OrgConstant;
import com.example.sys.org.dao.SysElementDao;
import com.example.sys.org.mapping.SysElementMapping;
import com.example.sys.org.po.SysElement;
import com.example.sys.org.vo.SysElementVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class SysElementServiceImpl extends BaseTreeServiceImpl<SysElementDao, SysElement, SysElementVo> implements SysElementService {

    @Resource
    private List<SysElementRelationService> sysElementRelationServices = new ArrayList<>();

    /***
     * 获取映射关系
     * @return
     */
    @Override
    public Class<? extends BaseMapping> getMappingClass() {
        return SysElementMapping.class;
    }

    /***
     *
     * 获取用户的权限id
     * @param userId
     * @return
     */
    @Override
    public List<String> getUserAuthIdList(String userId) {
        List<String> list = new ArrayList<>();
        for (SysElementRelationService sysElementRelationService : this.sysElementRelationServices) {
            List<String> authList = sysElementRelationService.getElementAuthList(userId);
            if (!authList.isEmpty()) {
                list.addAll(authList);
            }
        }
        return list;
    }


    /***
     *
     * 获取用户的权限ID
     * @return
     */
    @Override
    public List<String> getUserAuthIdList() {
        return getUserAuthIdList(UserUtils.getUserId());
    }


    /****
     *
     * 校验需要同步的结构id
     * @param list
     * @param type
     * @return
     */
    @Override
    public List<Long> checkOrgElementId(String type, List<Long> list) {
        List<Long> elementIdList = getBaseMapper().getElementIdList(type, list);
        list.removeAll(elementIdList);
        return list;
    }


    /***
     * 构建组织架构信息
     * @param type 为空表示所有节点下面的部门和人员，如果不为空就表示只是搜索部门的。
     * @return
     */
    @Override
    public List<SysElement> findTreeList(String type) {
        List<SysElement> trees = new ArrayList<>();
        List<SysElement> roots = this.findRoot(null , null);
        for (SysElement root : roots) {
            this.buildTree(root, type);
            trees.add(root);
        }
        return trees;
    }

    @Override
    public SysElement buildTree(SysElement sysElement, String type) {
        List<SysElement> sysTrees = this.findByPId(sysElement.getId(), type);
        if (type.equalsIgnoreCase(OrgConstant.PERSON) && sysElement.getType().equalsIgnoreCase(OrgConstant.DEPT)) {
            sysElement.setDisabled(true);
        }
        sysElement.getChildren().addAll(sysTrees);
        for (SysElement tree : sysTrees) {
            buildTree(tree, type);
        }
        return sysElement;
    }


    /***
     * 查询下一级所有直接子节点
     * @param pid
     * @param type 为空表示所有节点下面的部门和人员，如果不为空就表示只是搜索部门的。
     * @return
     */
    @Override
    public List<SysElement> findByPId(String pid, String type) {
        if (type.equalsIgnoreCase(OrgConstant.PERSON)) {
            //type 为空就表示搜索用户的，返回所有. 但是此时控制不能选择到部门。
            return getBaseMapper().findByPId(pid);
        }
        if (type.equalsIgnoreCase(OrgConstant.DEPT)) {
            return getBaseMapper().findByPIdAndType(pid, type);
        }
        if (type.equalsIgnoreCase(OrgConstant.USER_DEPT_GROUP)) {
            return findByPId(pid);
        }
        return null;
    }
}
